組件實作 : Demo
Navbar 導覽列是每個網站幾乎都會有的組件之一,就是網頁最上面的那一條橫幅,Navbar 的實作上,我們專注在兩個重點:一個是 RWD 響應時,選單內容的排列順序呈現方式;另一個則是選單的下拉功能的實作。有了目標之後,接著我們就開始來實作吧【1】【2】~
首先,我們在 HTML 中加入 Navbar 的主體,使用 a 標籤元素來當作選單內容,使用 a 標籤的原因是方便帶入超連結,當然你也可以使用 Button 標籤來代替。以下為 HTML 的主要架構:
HTML:
<div class="topnav">
<a href="#" class="active">Home</a>
<a href="#">News</a>
<a href="#">Document</a>
<a href="#">Contact</a>
<div class="dropdown">
<a href="#">About</a>
<div class="dropdown__content">
<a href="#">服務據點</a>
<a href="#">服務客戶</a>
<a href="#">服務地區</a>
<a href="#">徵才資訊</a>
</div>
</div>
</div>
顯示結果:
我們要在一個 class 名為topnav
的 div 內加入 a 元素,下拉選單則是使用 class 名為dropdown
的 div,裡面放一個dropdown__content
當成下拉選單的內容。
接著,我們在 topnav 裡面加入一個由 input 和 button 元素所組成的搜尋輸入框:
HTML:
<form action="傳送網址">
<input type="text" placeholder="Search.." name="search" />
<button type="submit"><i class="fa fa-search"></i></button>
</form>
顯示結果:
input 標籤的 placeholder 指的是提示輸入文字,當點擊輸入框時,輸入文字就會消失。雖然我們的 input 輸入框能夠正常顯示,但是 button 並沒有正常顯示圖示,這時候只要在<head>
裡面補上下面的 CDN 即可:
HTML:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
顯示結果:
我們加入一個搜尋框,它是由一個 input 元素外加上一個 button 元素所組成,最外圈則是用一個 form 表單將元素包起來,當搜尋按鈕被按下時,表單元素則會被送出,注意 button 標籤的 type 屬性值設定為submit
,這樣 input 輸入的值才能被正常的傳送。
架構有了之後,就是排版和外觀了,這部分依照各位的喜好去做調整,在開始美化之前,我習慣先把所有的元素都先排列好,再去調整外觀樣式、顏色,實作程式碼如下。
簡單起手式,去除多餘的 margin 和 padding。
CSS:
* {
margin: 0;
padding: 0;
}
顯示結果:
去除乾淨後,再來就是調整外觀:
CSS:
.topnav {
height: 64px;
background-image: linear-gradient(135deg, #00569e, #995db5);
font-family: sans-serif;
align-items: center;
}
a {
height: 100%;
padding: 0 15px;
color: #333;
text-decoration: none;
font-weight: 600;
font-size: 20px;
display: flex;
align-items: center;
}
顯示結果:
這裡的排版要以手機版面為優先
,如果你先做的是符合桌機的版面,之後想要改成手機版,可能會出現一些排版上的麻煩,這裡需稍加留意。基本的樣式完成後,我們想要加入一些游標經過的效果程式碼如下。
CSS:
.topnav a:hover {
background: #272727;
color: whitesmoke;
}
顯示結果:
在開始的 Home 因為背景顏色關係,會讓文字不明顯,於是用 first-child 去選取第一個 a 標籤元素 。
CSS:
a:first-child {
color: whitesmoke;
}
顯示結果:
顏色稍微舒服一些,Home 這個部分可以替換成 Logo。解決完主要選單,接著要處理次要選單的樣式修改,也就是下拉選單dropdown
和它的內容dropdown__content
。
CSS:
.dropdown {
height: 100%;
display: block;
}
.dropdown a {
color: black;
align-items: center;
}
.dropdown__content {
min-width: 160px;
padding: 12px 16px;
display: block;
background-color: #e0e0e0;
}
顯示結果:
加完上面的程式碼後,排版有了明顯變化,但這時候發現搜尋框跑版了,會發生這種情況,就是當初我在設計這個 Navbar 時,沒有考慮到 mobile first【3】的後果,導致花了很多時間在處理版面,最後的搜尋框折衷解決方案如下。
CSS:
form {
margin-top: 150px;
display: block;
}
form input,
button {
width: 100%;
padding-left: 20px;
border: none;
font-size: 1.5rem;
text-align: left;
box-sizing: border-box;
display: block;
}
顯示結果:
我們在上個章節完成了手機排版,接著要加入桌機的排版,這裡使用 Media queries 來撰寫 RWD,RWD 之後會另外寫一篇來探討,這邊直接使用@media (min-width: 767.98px)
,只要加入下列 CSS 即可完成桌機排版。
CSS:
@media (min-width: 767.98px) {
.topnav {
display: flex;
align-items: center;
position: relative;
}
a {
color: whitesmoke;
}
form {
display: flex;
position: absolute;
bottom: 12px;
right: 10px;
}
form input,
button {
width: auto;
padding: 5px;
font-size: 1.5rem;
}
.topnav a:hover {
background: rgba(255, 255, 255, 0.3);
color: whitesmoke;
}
.dropdown__content {
min-width: 160px;
padding: 12px 16px;
display: none;
}
.dropdown:hover .dropdown__content {
border-radius: 0 0 5px 5px;
background-image: linear-gradient(135deg, #00569e, #995db5);
display: block;
}
.dropdown {
height: 100%;
position: relative;
}
.dropdown a {
color: white;
align-items: center;
display: flex;
}
}
顯示結果:
Navbar 的製作格的花費心力,若每次遇到一個專案都要重新從頭開始製作,會花費很多的時間,建議可以先刻一個屬於自己的萬用樣板,再隨專案去調整,或是可以直接使用 **N**avbar · Bootstrap v5.0 也是不錯的選擇,比較可惜是沒有做漢堡 icon 的側邊欄滑動效果,不過之後的組件學習應該會碰到,學完後再加回 Navbar 組件就好。